/*
 * Licensed to the Tai Ping Jin Ke
 *
 * Copyright (c) 2022 .
 * All rights reserved.
 * 项目名称：太平金科-基础组件封装层-ElasticSearch-缺省实现
 * 版权说明：本软件属太平金融科技服务(上海)有限公司所有，在未获得太平金融科技服务(上海)有限公司正式授权情况下，任何企业和个人，不能获取、阅读、安装、传播本软件涉及的任何受知识产权保护的内容。
 */
package com.taipingframework.boot.es.conditions.query;

import org.elasticsearch.search.aggregations.AbstractAggregationBuilder;

import java.io.Serializable;

public interface Query<Children, T, R> extends Serializable {

    /**
     * 分组：GROUP BY 字段, ...
     * <p>例: groupBy("id", "name")</p>
     *
     * @param aggregationBuilder 聚合统计
     * @return children
     */
    Children groupBy(AbstractAggregationBuilder aggregationBuilder);

    /**
     * 排序：ORDER BY 字段, ... ASC
     * <p>例: orderByAsc("id", "name")</p>
     *
     * @return children
     */
    default Children orderByAsc(R column) {
        return orderBy(true, column);
    }

    /**
     * ignore
     */
    default Children orderByDesc(R column) {
        return orderBy(false, column);
    }

    /**
     * 排序：ORDER BY 字段, ...
     * <p>例: orderBy(true, "id", "name")</p>
     *
     * @param isAsc   是否是 ASC 排序
     * @param columns 字段数组
     * @return children
     */
    Children orderBy(boolean isAsc, R columns);

}
